//package com.ycy.lucene.sort;
//
//import com.ycy.lucene.index.IndexReadDemo;
//import org.apache.lucene.analysis.core.SimpleAnalyzer;
//import org.apache.lucene.index.DocValues;
//import org.apache.lucene.index.LeafReaderContext;
//import org.apache.lucene.index.NumericDocValues;
//import org.apache.lucene.queryparser.classic.ParseException;
//import org.apache.lucene.queryparser.classic.QueryParser;
//import org.apache.lucene.search.*;
//import org.junit.Test;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import java.io.IOException;
//
///**
// * https://brandnewuser.iteye.com/blog/2297896
// * <p>
// * 自定义排序
// *
// * @Author: ycy
// * @CreateDate: 2019/7/31 18:38
// */
//public class DemoFieldComparatorSource extends FieldComparatorSource {
//
//  Logger logger = LoggerFactory.getLogger(this.getClass());
//
//  // 这个东西是个比较器，只是初始化一次
//  @Override
//  public FieldComparator<?> newComparator(String fieldname, int numHits, int sortPos, boolean reversed) {
////    System.out.println(fieldname + "  " + numHits + "  " + sortPos + "  " + reversed);
//    logger.info("{}, {}, {}, {}", fieldname, numHits, sortPos, reversed);
//    return new DemoFieldComparator(numHits, fieldname);
//  }
//
//  private class DemoFieldComparator extends FieldComparator<Integer> implements LeafFieldComparator {
//
//    //取销量离50最近的文档
//    int bi = 50;
//
//    //这是个容器
//    private final int[] values;
//
//    private int bottom;                           // Value of bottom of queue
//
//    private int topValue;
//
//    public String fieldName;
//
//    public DemoFieldComparator(int numHits, String fieldName) {
//      this.values = new int[numHits];
//      this.fieldName = fieldName;
//    }
//
//    //比较大小的地方, 被上层调用
//    @Override
//    public int compare(int slot1, int slot2) {
//      return Integer.compare(values[slot1], values[slot2]);
//    }
//
//    //这个也被调用了
//    @Override
//    public Integer value(int slot) {
//      int value = values[slot];
//      return value;
//    }
//
//    //这个没有调用 不知道为啥
//    @Override
//    public void setTopValue(Integer value) {
//      topValue = value;
//    }
//
//    NumericDocValues currentReaderValues;
//
//    @Override
//    public LeafFieldComparator getLeafComparator(LeafReaderContext context) throws IOException {
//      //这个地方加载多次
//      currentReaderValues = DocValues.getNumeric(context.reader(), fieldName);
//      return this;
//    }
//
//    //以下方法是leafcomparator接口中的方法------
//
//    //只有队列满了之后，并且找到了比bottom还小的数，才开始setBottom
//    @Override
//    public void setBottom(int slot) {
////      logger.info("slot {},value {}", slot, values[slot]);
//      bottom = values[slot];
//    }
//
//    //和bottom比较  如果compareBottom>0 才能插入队列中
//    @Override
//    public int compareBottom(int doc) throws IOException {
//      long l = this.currentReaderValues.get(doc);
////      logger.info("{}", l);
//      return Integer.compare(bottom, (int) Math.abs(bi - l));
//    }
//
//    //入队的时候如果队列没满，按照自增顺序插入,队列没满按照的compare去比较
//    @Override
//    public void copy(int slot, int doc) throws IOException {
//      //如果这个doc可以经过比较可以插入到队列中之后 doc 和slot是对应的
//      long l = currentReaderValues.;
//      logger.info("slot {},docid {} ,{} {}", slot, doc, fieldName, l);
//      values[slot] = (int) Math.abs(bi - l);
//    }
//
//    @Override
//    public void setScorer(Scorable scorer) throws IOException {
//
//    }
//
//    //调用了 但不知道它敢了什么？
//    @Override
//    public void setScorer(Scorer scorer) throws IOException {
////      currentReaderValues.get(scorer.docID());
//    }
//
//    //没有调用 不知道为啥
//    @Override
//    public int compareTop(int doc) throws IOException {
//      long l = this.currentReaderValues.get(doc);
//      return Integer.compare(topValue, (int) Math.abs(bi - l));
//    }
//
//  }
//
//  /**
//   * 不使用排序
//   */
//  @Test
//  public void test1() {
//    QueryParser queryParser = new QueryParser("name", new SimpleAnalyzer());
//    Query query = null;
//    try {
//      query = queryParser.parse("真");
//      IndexReadDemo.search(query, 50, null);
//    } catch (ParseException e) {
//      e.printStackTrace();
//    }
//  }
//
//  /**
//   * 自定义排序，几个字段排序
//   */
//  @Test
//  public void test2() {
//    QueryParser queryParser = new QueryParser("name", new SimpleAnalyzer());
//    Query query = null;
//    try {
//      query = queryParser.parse("真");
//      //自定义排序
//      SortField sortField = new SortField("sales", new DemoFieldComparatorSource());
//      IndexReadDemo.search(query, 21, new Sort(sortField));
//    } catch (Exception e) {
//      e.printStackTrace();
//    }
//  }
//
//  /**
//   * 多个排序字段
//   */
//  @Test
//  public void test3() {
//    QueryParser queryParser = new QueryParser("name", new SimpleAnalyzer());
//    Query query = null;
//    try {
//      query = queryParser.parse("真");
//      //自定义排序
//      SortField sortField = new SortField("sales", new DemoFieldComparatorSource());
//      SortField group = new SortField("group", SortField.Type.INT);
//      IndexReadDemo.search(query, 13, new Sort(group, sortField));
//    } catch (Exception e) {
//      e.printStackTrace();
//    }
//  }
//
//}
